Я использовал Visual Studio 2013 Т.к. код не компилировался из-за того, что компилятор считает функцию fopen - unsafe, то пришлось добавить в проект _CRT_SECURE_NO_WARNINGS в options -> C/C++ -> Preprocessor -> Preprocessor Definitions После этого, проанализировав программу, анализатор выдал 4-ре ошибки C6001 Using uninitialized memory Using uninitialized memory 'result'. FalsePositives false_positives_sample.c 71 'result' is not initialized 54 Assume switch ( 'type' ) resolves to the default case 55 'result' is an In/Out argument to 'push' (declared on line 15) 71 'result' is used, but may not have been initialized 71 C6031 Return value ignored Return value ignored: 'fscanf'. FalsePositives false_positives_sample.c 315 C6031 Return value ignored Return value ignored: 'scanf'. FalsePositives false_positives_sample.c 333 C6031 Return value ignored Return value ignored: 'scanf'. FalsePositives false_positives_sample.c 343 Первая ошибка - является более, чем правомерной, т.к. параметр result инициализируется в разных ветвях switch, но из-за отсутствия в нём клаузы default - если нам передали неверное значение в параметре функции (которое имеет тип int, а не enum, и потому мы не можем быть уверены, что нам не передали значение за границами обрабатываемых значений в case), то у нас не выполнится ни один из вариантов в switch и мы передадим неинициализированную переменную в параметр другой функции. Оставшиеся 3 ошибки являются однотипными. И так же являются достаточно важными, потому что может произойти чтение не всех переменных в sscanf и тогда некоторые останутся не проинициализированными, а такое нужно обрабатывать Более важно, что нету сообщения о небезопасном считывании, потому что есть возможность сделать buffer overflow Анализ крайне недостаточный, т.к. не выявил такие важные ошибки, как: 1) стр. 22, 32 - как выход за пределы массива (многократно по обе стороны массива) 2) стр. 84 - неявное преобразование типов в функции isSpace: bool -> int, что нарушает логику, которая есть в missSpaces, что влечёт ошибку в 91 строке 3) стр. 116 - switch без default 4) стр. 265 - отсутствие необходимой обработки конца рекурсивного разбора строки, но эта ошибка является алгоритмической, и поэтому не учитывается в общей статистике 5) стр. 273, 288 - отсутствие проверки передаваемого указателя функции 6) стр. 299 - отсутствие закрытия файла 7) стр. 302 - отсутствие проверки успешного открытия файла 8) стр. 308 - отсутствие проверки успешного аллоцирования памяти 9) стр. 317 - нету указаний на возможный buffer overflow 10) стр. 332, стр. 345 - неправильное считывание используя scanf, т.к. тип, в который записывается значение не совпадает с форматом ввода (%f vs %lf для double) всего 12 ошибок (4-я не учитывается по упомянутой причине) Вывод: точность анализа - плохая найденно лишь 4 из 16 ошибок, точность - 25%, но важно учитывать, что качество упущенных ошибок гораздо более весомое, и необнаруженные ошибки гораздо более критичны (на столько, что 3 однотипных ошибки, найденных анализатором являются вообще говоря ошибками в программе, но не являются ошибками безопасности), а среди упущенных ошибок такие важные, как buffer overflow